/*
     *busy---4
     *res---16
     *dc---17
     *cs---5
     *clk---18
     *din---23
     *gnd---gnd
     *vcc---3.3v
     *Author: CrayonDing
     *修改自开源项目 https://github.com/zhushengji/GxEPD2_Version_4in2_epd_calendar
*/
#include <U8g2_for_Adafruit_GFX.h>
#include <GxEPD2_3C.h>
#include <ArduinoJson.h>
#include <Timezone.h>
GxEPD2_3C<GxEPD2_420c, GxEPD2_420c::HEIGHT> display(GxEPD2_420c(/*CS=5*/ SS, /*DC=*/ 17, /*RST=*/ 16, /*BUSY=*/ 4)); // 驱动屏幕
#include "gb2312.c"
#include "imagedata.h"
#include "Webserver.h"
#include "NTP.h"

extern const uint8_t chinese_city_gb2312[239032] U8G2_FONT_SECTION("chinese_city_gb2312");
U8G2_FOR_ADAFRUIT_GFX u8g2Fonts;
//****** HTTP服务器配置 ******
String language = "zh-Hans"; // 请求语言
String url_yiyan = "https://v1.hitokoto.cn/?min_length=10&max_length=25";//一言获取地址
String url_ActualWeather;   //实况天气地址
String url_FutureWeather;   //未来天气地址
//****** 天气数据
//我们要从此网页中提取的数据的类型
struct ActualWeather
{
  char status_code[64];  //错误代码
  char city[16];         //城市名称
  char weather_name[16]; //天气现象名称
  char weather_code[4];  //天气现象代码
  char temp[5];          //温度
  char last_update[25];  //最后更新时间
};
ActualWeather actual;  //创建结构体变量 目前的

struct FutureWeather
{
  char status_code[64];       //错误代码

  char date0[14];             //今天日期
  char date0_text_day[20];    //白天天气现象名称
  char date0_code_day[4];     //白天天气现象代码
  char date0_text_night[16];  //晚上天气现象名称
  char date0_code_night[4];   //晚上天气现象代码
  char date0_high[5];         //最高温度
  char date0_low[5];          //最低温度
  char date0_humidity[5];     //相对湿度
  char date0_wind_scale[5];   //风力等级

  char date1[14];             //明天日期
  char date1_text_day[20];    //白天天气现象名称
  char date1_code_day[4];     //白天天气现象代码
  char date1_text_night[16];  //晚上天气现象名称
  char date1_code_night[4];   //晚上天气现象代码
  char date1_high[5];         //最高温度
  char date1_low[5];          //最低温度
  //char date1_humidity[5];     //相对湿度

  char date2[14];             //后天日期
  char date2_text_day[20];    //白天天气现象名称
  char date2_code_day[4];     //白天天气现象代码
  char date2_text_night[16];  //晚上天气现象名称
  char date2_code_night[4];   //晚上天气现象代码
  char date2_high[5];         //最高温度
  char date2_low[5];          //最低温度
  //char date2_humidity[5];     //相对湿度
};
FutureWeather future; //创建结构体变量 未来
struct News  //新闻API
{
  char status_code[64]; //错误代码
  char title[11][64];
};
struct Hitokoto  //一言API
{
  char status_code[64]; //错误代码
  char hitokoto[64];
};
//****** 一些变量 ******
String webServer_news = " ";
boolean night_updated = 1; //夜间更新 1-不更新 0-更新
//RTC临时数据
#define RTC_hour_dz 0           //小时地址
#define RTC_night_count_dz 1    //夜间计数地址
#define RTC_peiwang_state_dz 2  //配网状态地址
uint32_t RTC_hour = 100;        //小时
uint32_t RTC_night_count = 0;   //24-6点，夜间不更新计数
int32_t night_count_max = 0;    //需要跳过几次
uint32_t RTC_peiwang_state = 0; //配网状态 1-需要
//int daydate;//当天日期
Hitokoto yiyan; //创建结构体变量 一言
News xinwen; //创建结构体变量 新闻
int udc=0;//更新次数记录

void setup()
{
  Serial.begin(115200);
  EEPROM.begin(4096);
  display.init();
  u8g2Fonts.begin(display);//将u8g2连接到display
  display.firstPage();
  display.display(1); 
  wifi_init();
}

void loop() {
  /*后台配置*/
  if (settingMode) {
    dnsServer.processNextRequest();
  }
  webServer.handleClient();
  if (!settingMode) {
    GetData();//请求信息
    initNTP();//初始化时间NTP服务器
    display.fillScreen(GxEPD_WHITE);
    get_weather();//获取天气
    updatetime();//时间更新
    hitokoto();//获取一言
    newsdisplay();//刷新显示
    udc++;
    display.nextPage();
    delay(300000);//5分钟更新一次
  }
  };
